Publishing icfpy to PyPI

    Your project is already set up for this — it has a PEP 621 pyproject.toml with the hatchling backend, a src/ layout, and a version (1.0.0). Here's the procedure.

    1. One-time prerequisites

    - Create a PyPI account at https://pypi.org (and optionally https://test.pypi.org for dry runs).
    - Set up a token: in PyPI account settings → API tokens → create one. Tokens are the modern auth method (username/password upload is disabled).
    - Install the build/upload tools:
    pip install build twine

    2. Check the package name is available

    pip install icfpy only works if the name icfpy is unclaimed on PyPI. Search https://pypi.org/project/icfpy/ — if it's taken, you'll need a different name in
    pyproject.toml (the import name import icfpy can stay the same regardless).

    3. Build the distribution artifacts

    From the project root:
    python -m build
    This produces dist/icfpy-1.0.0-py3-none-any.whl and dist/icfpy-1.0.0.tar.gz.

    4. (Recommended) Test on TestPyPI first

    twine upload --repository testpypi dist/*
    pip install --index-url https://test.pypi.org/simple/ icfpy
	
    5. Upload to the real PyPI

    twine check dist/*          # validates metadata/README rendering
    twine upload dist/*
    When prompted, use __token__ as the username and your API token (starting pypi-...) as the password.

    After this, anyone can run pip install icfpy.

    Things worth tightening before you publish

    A few items in your current pyproject.toml/repo that PyPI users (and the metadata) benefit from:

    - License classifier/format: you used license = { text = "CC-BY-4.0" }. Newer packaging prefers the SPDX string form license = "CC-BY-4.0". Note CC-BY is unusual
    for code (it's designed for documents/specs) — many code libraries pick MIT/Apache-2.0. Worth a deliberate choice, since the spec is CC-BY but the implementation is    separate.
    - project.urls: add Repository, Documentation, and Issues links — these show on the PyPI sidebar.
    - README rendering: PyPI renders README.md as the project page; twine check confirms it parses.
    - Version bumps: PyPI refuses to overwrite an existing version. Every release needs a new version in pyproject.toml (e.g. 1.0.1). Consider tagging releases in git
    to match.
    - .gitignore: make sure dist/, build/, and *.egg-info/ are ignored so build artifacts don't get committed.

    Notes

    - The package installs with zero runtime dependencies, so users get a clean, fast install — nothing extra to resolve.
    - For automated releases, PyPI's trusted publishing (OIDC via GitHub Actions) lets you publish on tag-push without storing a token — a good next step once manual
    upload works.
    - This publishes to the public index for everyone, which is different from the earlier Claude Code permission change (that only affected whether pip install runs
    without a prompt in your local sessions).